/**
 * 1 获取用户的收货地址
 *  1 绑定点击事件
 *  2 调用小程序的内置 api 获取用户的收货地址
 * 
 * 2 将收货地址信息保存到缓存中
 *  0 onLoad onShow
 *  1 获取本地存储中的地址数据
 *  2 把数据 设置给data中的一个变量
 * 
 * 3 onShow
 *  0 回到了商品详情页面 第一次添加商品的时候 手动添加了属性
 *    1 num = 1
 *    2 checked = true
 *  1 获取缓存中的购物车数组
 *  2 把购物车数据 填充到data中
 * 4 全选的实现 数据的展示
 *  1 onShow 获取缓存中的购物车数组
 *  2 根据古玩城中的商品数据 所有的商品都被选中 checked=true 全选就被选中
 * 
 * 5 总价格和总数量
 *  1 都需要商品被选中 我们才拿它来计算
 *  2 获取购物车数组
 *  3 遍历
 *  4 判断商品是否被选中
 *  5 总价格 += 商品的单价 * 商品的数量
 *  5 总数量 += 商品的数量
 *  6 把计算后的价格和数量 设置回data中即可
 * 
 * 6商品的选中
 *  1 绑定change事件
 *  2 获取到被修改的商品对象
 *  3 商品对象的选中状态 取反
 *  4 重新填充回data中和缓存中
 *  5 重新计算全选。总价格 和 总数量。。。
 * 
 * 7 全选和反选
 *  1 全选复选框绑定事件 change
 *  2 获取data中的全选变量 allChecked
 *  3 直接取反 allChecked=!allChecked
 *  4 遍历购物车数组 让里面 商品 选中状态跟随 allChecked 改变而改变
 *  5 把购物车数组和allChecked 重新设置回data把购物车重新设置回缓存中
 * 
 * 8 商品数量的编辑
 *  1 "+" "-" 按钮 绑定同一个点击事件 区分的关键 自定义属性
 *    1 "+" "+1"
 *    2 "-" "-1"
 *  2 传递被定金的商品id goods_id
 *  3 获取data中的购物车数组 来获取需要被修改的商品对象
 *  4 直接修改商品对象的数量 num 通过operation的值 “-1” “1”
 *    弹窗提示 询问用户 是否要删除
 *    使用自带的api wx.showModal
 *    1 确定 直接执行删除
 *    2 取消 什么都不做
 *  5 把cart数组 重新设置回 缓存中 和data中 this.setCart
 * 
 * 9 点击结算
 *  1 判断有没有收货地址信息
 *  2 判断用户有没有选购商品
 *  3 经过以上的严重 跳转到 支付页面
 */
import {showModal, showToast} from "../../utils/asyncWx.js"
Page({
  data: {
    address: {},
    cart: [],
    allChecked:false,
    totalPrice:0,
    totalNum:0
  },
  onShow() {
    // 从缓存中获取收货地址
    const address = wx.getStorageSync("address") || {};
    // 获取购物车里的数据
    const cart = wx.getStorageSync("cart") || [];
    // 保存收货地址
    this.setData({address});
    //设置复选框和全选，总数量和总价格的初始值
    this.setCart(cart);
  },
  // 点击 复选框
  handleChooseAddress() {
    // 1 获取收货地址
    wx.chooseAddress({
      success: (result) => {
        // 2 获取返回的收货地址数据
        let address = result;
        // 3 合并成收货地址
        address.all = address.provinceName + address.cityName + address.countyName + address.detailInfo;
        // 4 将收货地址保存到缓存中
        wx.setStorageSync("address", address);
      }
    });
  },
  
  handleChecked(e){
    // 1 获取商品的id
    const goods_id = e.currentTarget.dataset.id;
    // 2 获取购物车数据
    let {cart} = this.data;
    // 3 获取商品对象的index,不能直接从wxml中传进来index
    let index = cart.findIndex(v=>v.goods_id === goods_id);
    // 4 选中状态取反
    cart[index].checked = !cart[index].checked;
    // 5 6把购物车数据重新设置回data和缓存中，并重新计算总价格和总数量，全选
    this.setCart(cart);
  },
  //点击 全选 事件
  handleAllChecked(){
    // 1 获取data中cart, allChecked变量
    let {cart,allChecked} = this.data;
    // 取反allChecked
    allChecked = !allChecked;
    //修改cart中的checked的值
    cart.forEach(v=>v.checked=allChecked);
    //保存cart,并重新计算
    this.setCart(cart);
  },
  // 点击 "-1" "1" 事件
  async handleEdit(e){
    // 获取商品的id和操作值 "-1" "1"
    const goods_id = e.currentTarget.dataset.id;
    const {operation} = e.currentTarget.dataset;
    //获取购物车数组
    let {cart} = this.data;
    // 获取操作对象的下标
    const index = cart.findIndex(v=>v.goods_id === goods_id);
    // 当商品数量为1，且点击了-1时，判断商品是否要删除
    if(cart[index].num === 1 && operation === -1){
      //使用已经自己封装的函数，返回值：用户点击的状态
      const res = await showModal({content:"您确定要删除商品么？"});
      //当返回确定时，则删除商品，否则什么都不做
      //同时更新数据（总价格，总数量，购物车数组等等）
      if (res.confirm) {
        cart.splice(index, 1);
        this.setCart(cart);
      }
    } else{
      // 修改商品的数量
      cart[index].num += operation;
      // 重新设置data中cart的值， 和重新设置缓存中cart 的值
      this.setCart(cart);
    }
    
    
  },
  setCart(cart){
     // 1 计算全选
    // every数组方法 会遍历 会接受一个回调函数 那么 每一个回调函数都返回true
    // 那么every方法的返回值才为true
    //只要 有一个回调函数返回了false 那么不再循环执行，直接返回false
    //空数组 调用 every 返回值就是true
    // const allChecked = cart.length ? cart.every(v => v.checked) : false;
    //2 计算总价格和总数量, 全选
    let totalPrice = 0;
    let totalNum = 0;
    let allChecked=true;
    if(cart.length){
      cart.forEach(v => {
        if(v.checked){
          totalPrice += v.goods_price*v.num;
          totalNum += v.num;
        }else{
          allChecked=false;
        }
      });
    }
    //再一次判断allChecked的值，避免当cart为空时，
    //forEach中的函数不执行，导致allChecked值出错
    allChecked = cart.length!=0?allChecked:false;
    //将收货地址和购物车数据保存到数据中
    this.setData({
      cart,
      allChecked,
      totalPrice,
      totalNum
    })
    wx.setStorageSync("cart", cart);
  },
  handlePay(){
    const {address, totalNum} = this.data;
    if(totalNum === 0){
      showToast({title:"您还没有选购商品"});
      return;
    }
    if(!address.userName){
      showToast({title:"您还没有填写收货地址"});
      return;
    }
    wx.navigateTo({
      url: '/pages/pay/pay',
    });
  }

})

